Improve error handling, in particular fixing the ProtocolError that is thrown
authoremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Thu, 23 Mar 2006 11:59:43 +0000 (12:59 +0100)
committeremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Thu, 23 Mar 2006 11:59:43 +0000 (12:59 +0100)
when a domain is specified by the user that does not exist.  Added a few
error codes -- many more to come, I expect.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
tools/python/xen/xend/XendClient.py
tools/python/xen/xend/XendError.py
tools/python/xen/xend/server/XMLRPCServer.py
tools/python/xen/xm/main.py

index 46ed63866eb38a39a73d32c4c85cbb79271d3906..974f4b71217c2f5add70545e997940ec5a4cb194 100644 (file)
@@ -21,4 +21,8 @@ from xen.util.xmlrpclib2 import ServerProxy
 
 XML_RPC_SOCKET = "/var/run/xend-xmlrpc.sock"
 
+ERROR_INTERNAL = 1
+ERROR_GENERIC = 2
+ERROR_INVALID_DOMAIN = 3
+
 server = ServerProxy('httpu:///var/run/xend-xmlrpc.sock')
index 0b0dc7b3a3906bfdcc8a743580c386a8b4d08d0b..efe7fe5e32a10c2efe5a361697441d468f4840fc 100644 (file)
 
 from xmlrpclib import Fault
 
+import XendClient
+
 class XendError(Fault):
     
     def __init__(self, value):
-        Fault.__init__(self, 2, value)
+        Fault.__init__(self, XendClient.ERROR_GENERIC, value)
         self.value = value
 
     def __str__(self):
index 8c3890fe62d523384cd3b0aa33428b632b1931ed..1e553a84e340a2a0d9f14071c2d39d9b7bcd20cb 100644 (file)
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #============================================================================
 # Copyright (C) 2006 Anthony Liguori <aliguori@us.ibm.com>
-# Copyright (C) 2006 XenSource Ltd
+# Copyright (C) 2006 XenSource Ltd.
 #============================================================================
 
+import xmlrpclib
+
 from xen.xend import XendDomain, XendDomainInfo, XendNode, \
                      XendLogging, XendDmesg
 from xen.util.xmlrpclib2 import UnixXMLRPCServer, TCPXMLRPCServer
 
-from xen.xend.XendClient import XML_RPC_SOCKET
+from xen.xend.XendClient import XML_RPC_SOCKET, ERROR_INVALID_DOMAIN
 
 def lookup(domid):
-    return XendDomain.instance().domain_lookup_by_name_or_id(domid)
+    try:
+        return XendDomain.instance().domain_lookup_by_name_or_id(domid)
+    except exn:
+        log.exception(exn)
+        raise exn
 
 def dispatch(domid, fn, args):
     info = lookup(domid)
-    return getattr(info, fn)(*args)
+    if info:
+        try:
+            return getattr(info, fn)(*args)
+        except exn:
+            log.exception(exn)
+            raise exn
+    else:
+        raise xmlrpclib.Fault(ERROR_INVALID_DOMAIN, domid)
 
 def domain(domid):
     info = lookup(domid)
-    return info.sxpr()
+    if info:
+        try:
+            return info.sxpr()
+        except exn:
+            log.exception(exn)
+            raise exn
+    else:
+        raise xmlrpclib.Fault(ERROR_INVALID_DOMAIN, domid)
 
 def domains(detail=1):
     if detail < 1:
index d3cab934525dd984a3215e42cfb6d942addee40f..6bb09b29f6ba4771a19891d709b812afe080ac73 100644 (file)
@@ -1,6 +1,6 @@
 # (C) Copyright IBM Corp. 2005
 # Copyright (C) 2004 Mike Wray
-# Copyright (c) 2005 XenSource Ltd
+# Copyright (c) 2005-2006 XenSource Ltd.
 #
 # Authors:
 #     Sean Dague <sean at dague dot net>
@@ -38,7 +38,7 @@ from xen.xend import sxp
 from xen.xm.opts import *
 
 import console
-
+import xen.xend.XendClient
 from xen.xend.XendClient import server
 
 # getopt.gnu_getopt is better, but only exists in Python 2.3+.  Use
@@ -1111,7 +1111,10 @@ def main(argv=sys.argv):
         except SystemExit:
             sys.exit(1)
         except xmlrpclib.Fault, ex:
-            print "Error: %s" % ex.faultString
+            if ex.faultCode == xen.xend.XendClient.ERROR_INVALID_DOMAIN:
+                print "Error: the domain '%s' does not exist." % ex.faultString
+            else:
+                print "Error: %s" % ex.faultString
             sys.exit(1)
         except:
             print "Unexpected error:", sys.exc_info()[0]